import { BaseEntityDto } from '@/common/dto/base-entity.dto';
import { Transform } from 'class-transformer';
import {
  IsNumber,
  IsNumberString,
  IsOptional,
  IsString,
  MaxLength,
} from 'class-validator';
import { typeMapValue } from '../interface';

export class CreateMenuDto extends BaseEntityDto {
  // 菜单名称
  @IsString()
  @MaxLength(20)
  name: string;

  // 显示顺序
  @IsOptional()
  @IsNumber()
  sort?: number;

  // 父级ID
  @Transform(({ value }) => {
    return String(value);
  })
  @IsNumberString()
  @IsOptional()
  parentId?: string | number;

  // 菜单类型（M目录 C菜单 F按钮）
  @Transform(({ value }) => {
    // 可以转换后面的真实数据(【遗留问题，会执行两次】)
    if (typeof value === 'string') {
      return typeMapValue.get(value);
    }
    return value;
  })
  @IsNumber()
  type: number;

  // 图标
  // @ValidateIf((o) => o.type != 'MENU')
  @IsOptional()
  @IsString()
  @MaxLength(50)
  icon?: string;

  // 组件地址
  @IsOptional()
  @IsString()
  @MaxLength(50)
  component?: string;

  // 重定向
  @IsOptional()
  @IsString()
  @MaxLength(50)
  redirect?: string;

  // 按钮权限标识（只在 type 为 'BUTTON' 时必填）
  // @ValidateIf((o) => o.type === 'BUTTON')
  @IsOptional()
  @IsString()
  perm?: string;

  // 【目录】只有一个子路由是否始终显示
  @IsOptional()
  @IsNumber()
  alwaysShow?: number;

  // 是否缓存
  @IsOptional()
  @IsNumber()
  keepAlive?: number;

  // 是否隐藏（只在 type 不为 'BUTTON' 时必填）
  // @ValidateIf((o) => o.type != 'BUTTON')
  @Transform(({ value }) => {
    if (typeof value === 'string') {
      return Number(value);
    }
    return value;
  })
  @IsOptional()
  @IsNumber()
  visible?: number;

  // 访问路径
  @IsOptional()
  @IsString()
  @MaxLength(50)
  routePath?: string;

  // 路由、组件名称
  @IsOptional()
  @IsString()
  @MaxLength(50)
  routeName?: string;

  // 路由、组件名称
  // @ValidateIf((o) => o.type != 'MENU')
  @Transform(({ value }) => {
    // 可以转换后面的真实数据
    if (typeof value != 'string') {
      return JSON.stringify(value);
    }
    return value;
  })
  @IsOptional()
  params?: string;

  // // 组件名称
  // @IsOptional()
  // @IsString()
  // @MaxLength(50)
  // componentName?: string;

  // // 权限类型
  // @IsOptional()
  // @IsString()
  // @MaxLength(50)
  // permissionType?: string;

  // // 权限编码
  // @IsOptional()
  // @IsString()
  // @MaxLength(50)
  // authSymbol?: string;

  // // 显示排序 asc
  // @IsOptional()
  // @IsNumber()
  // orderWeight?: number;

  // // 备注
  // @IsOptional()
  // @IsString()
  // remark?: string;

  // // 是否新标签页打开
  // @IsOptional()
  // @IsBoolean()
  // createTab?: boolean;

  // // 访问路径
  // @IsOptional()
  // @IsString()
  // @MaxLength(50)
  // path?: string;
}

// perm
// redirect
// parentId: req.joi.string().regex(/^\d+$/).required(),
// visible: req.joi.number(),
// sort: req.joi.number(),
// type: req.joi.string().valid('CATALOG', 'MENU', 'BUTTON', 'EXTLINK').required(), // 类型
// alwaysShow: req.joi.number(),
// keepAlive: req.joi.number(),
// name: req.joi.string().required(),
// routeName: req.joi.string().required(),
// routePath: req.joi.string().required(),
// icon: req.joi.string().required(),
// component: req.joi.string().required(),
// params: req.joi.array().items(
// 	req.joi.object({
// 		key: req.joi.string(),
// 		value: req.joi.string()
// 	})
// )
